﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Entities;
using BusinessLogicLayer.Validation;
using DataAccessLayer;



namespace BusinessLogicLayer
{
    public class GiaoVienManager:IValidation<GiaoVien>
    {
        // truy xuất từ lớp DataAccess lấy thuộc tính IRepostitory
        private readonly IRepository<GiaoVien> _repository;
        /// <summary>
        /// khởi tạo lớp GiaoVienManager 
        /// </summary>
        /// <param name="itr"></param>
        public GiaoVienManager(IRepository<GiaoVien> itr)
        {
            _repository = itr;
        }
        /// <summary>
        /// kiểm tra thông tin giáo viên
        /// </summary>
        /// <param name="giaovien"></param>
        /// <returns></returns>
        public ValidationResult Validate(GiaoVien giaovien)
        {
            var toResult = new ValidationResult();
            try
            {
                if (string.IsNullOrEmpty(giaovien.TenGV.Trim()))
                    toResult.Messages.Add("Tên giáo viên không được để trống");
                if (string.IsNullOrEmpty(giaovien.NgaySinh.ToString().Trim()))
                    toResult.Messages.Add("Ngày sinh giáo viên không được để trống");
                if (string.IsNullOrEmpty(giaovien.GioiTinh.Trim()))
                    toResult.Messages.Add("Giới tính giáo viên không được để trống");
                if (string.IsNullOrEmpty(giaovien.ChucVu.Trim()))
                    toResult.Messages.Add("Chức vụ giáo viên không được để trống");
                if (string.IsNullOrEmpty(giaovien.HocVi.Trim()))
                    toResult.Messages.Add("Học vị giáo viên không được để trống");
                if (string.IsNullOrEmpty(giaovien.Email.Trim()))
                    toResult.Messages.Add("Địa chỉ email không được để trống");
            }
            catch (Exception)
            {

            }
            return toResult;
        }
        /// <summary>
        /// thêm và cập nhật thông tin giáo viên
        /// </summary>
        /// <param name="giaovien"></param>
        /// <returns></returns>
        public ActionResult InsertOrUpdate(GiaoVien giaovien)
        {
            var iouResult = new ActionResult();
            try
            {
                if (!_repository.InsertOrUpdate(giaovien))
                    iouResult.ex.Add(new Exception("Thêm Giáo viên không thành công"));
            }
            catch (Exception e)
            {
                iouResult.ex.Add(e);
            }
            return iouResult;
        }
        /// <summary>
        /// xóa thông tin giáo viên
        /// </summary>
        /// <param name="giaovien"></param>
        /// <returns></returns>
        public ActionResult Delete(GiaoVien giaovien)
        {
            var dResult = new ActionResult();
            try
            {
                if (!_repository.Delete(giaovien))
                    dResult.ex.Add(new Exception("Xóa thông tin giáo viên không thành công!"));
            }
            catch (Exception e)
            {
                dResult.ex.Add(e);
            }
            return dResult;
        }
        /// <summary>
        /// xóa thông tin giáo viên theo Mã giáo viên
        /// </summary>
        /// <param name="idGV"></param>
        /// <returns></returns>
        public ActionResult Delete(string idGV)
        {
            var dResult = new ActionResult();
            try
            {
                if (!_repository.Delete(id => id.MaGV == idGV))
                    dResult.ex.Add(new Exception("Xóa thông tin giáo viên không thành công! "));
            }
            catch (Exception e)
            {
                dResult.ex.Add(e);
            }
            return dResult;
        }
        /// <summary>
        /// tìm thông tin giáo viên
        /// </summary>
        /// <param name="predicate"></param>
        /// <returns></returns>
        public ActionResultAsList<GiaoVien> Find(Expression<Func<GiaoVien, bool>> predicate)
        {
            var fResult = new ActionResultAsList<GiaoVien>();
            try
            {
                fResult.Result = _repository.Find(predicate).ToList();
                if (fResult.Result.Count == 0)
                    fResult.ex.Add(new Exception("Không tìm thấy giáo viên phù hợp"));
            }
            catch (Exception e)
            {
                fResult.ex.Add(e);
            }
            return fResult;
        }

    }
}
